package edu.upc.clase.demo.dao.impl;

import edu.upc.clase.demo.dao.UsuarioDao;
import edu.upc.clase.demo.entity.Usuario;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author gian
 */
@Repository
public class UsuarioDaoImpl extends SimpleJdbcDaoSupport implements UsuarioDao {

    private static Logger log = LoggerFactory.getLogger(UsuarioDaoImpl.class);

    @Autowired
    public UsuarioDaoImpl(DataSource dataSource) {
        log.info("Asignando el dataSource");
        setDataSource(dataSource);
    }

    @Override
    public Integer insertar(Usuario usuario) {

        getJdbcTemplate().update(
                "insert into usuario (nombres, apellidos, sexo, fechnac, pais, actividad, tipo, correo, clave, foto) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
                usuario.getNombres(), usuario.getApellidos(), usuario.getSexo(), usuario.getFechnac(), usuario.getPaisresidente(), usuario.getActividad(), usuario.getTipo(), usuario.getCorreo(), usuario.getClave(), usuario.getFoto());
        return getSimpleJdbcTemplate().queryForInt("select last_insert_id()");
    }

    @Override
    public void actualizar(Usuario usuario) {
        getJdbcTemplate().update(
                "update usuario set nombres = ?, apellidos = ?, sexo = ?, fechnac = ?, pais = ?, actividad = ?, tipo = ?, correo = ?, clave = ?, foto = ? where idusuario = ?",
                usuario.getNombres(), usuario.getApellidos(), usuario.getSexo(), usuario.getFechnac(), usuario.getPaisresidente(), usuario.getActividad(), usuario.getTipo(), usuario.getCorreo(), usuario.getClave(), usuario.getFoto(), usuario.getIdusuario());
    }

    @Override
    public void eliminar(Usuario usuario) {
        getJdbcTemplate().update(
                "delete from usuario where idusuario = ?", usuario.getIdusuario());
    }

    @Override
    public Usuario buscar(Integer idusuario) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "select idusuario, nombres, apellidos, sexo, fechnac, pais, actividad, tipo, correo, clave, foto from usuario where idusuario=?",
                    new BeanPropertyRowMapper<Usuario>(Usuario.class), idusuario);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public List<Usuario> buscarTodos() {
        return getSimpleJdbcTemplate().query(
                "select idusuario, nombres, apellidos, sexo, fechnac, pais, actividad, tipo, correo, clave, foto from usuario",
                new BeanPropertyRowMapper<Usuario>(Usuario.class));
    }

    @Override
    public Usuario buscar(String correo) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "select idusuario, nombres, apellidos, sexo, fechnac, pais, actividad, tipo, correo, clave, foto from usuario where correo=?",
                    new BeanPropertyRowMapper<Usuario>(Usuario.class), correo);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public List<Usuario> buscarPorNombre(String nombres, String apellidos) {
        try {
            Map<String,String> parametros = new HashMap<String,String>();
            parametros.put("nombres","%"+nombres+"%");
            parametros.put("apellidos","%"+apellidos+"%");
            return getSimpleJdbcTemplate().query(
                    "select idusuario, nombres, apellidos, sexo, fechnac, pais, actividad, tipo, correo, clave, foto from usuario where nombres like :nombres and apellidos like :apellidos",
                    new BeanPropertyRowMapper<Usuario>(Usuario.class),parametros);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
}